#include "ConexionCliente.h"
#include "../../SDLtoolkit/ScenarioElement.h"
#include "../DTOBackground.h"
#include "../DTOCliente.h"
#include "../DTOFinHandshake.h"

ConexionCliente::ConexionCliente(std::string id,std::string host,BattleMasterInterface* game,SocketProtocoloPlano* socket,ColaMensajes* enviar,ColaMensajes* recibir,const bool* conexionActiva){
	this->id = id;
	this->conexionAServer = NULL;

	//Hago el handshake
	this->handshake(id,host,game,socket,enviar,recibir,conexionActiva);
}


std::string ConexionCliente::getId(){
	return id;
}

void ConexionCliente::handshake(std::string id,std::string host,BattleMasterInterface* game,SocketProtocoloPlano* socket,ColaMensajes* enviar,ColaMensajes* recibir,const bool* conexionActiva){
	ColaMensajes* mensajesHandshake = new ColaMensajes(id);
	ConexionBidireccional* conexion = new ConexionBidireccional(host,socket,mensajesHandshake,conexionActiva);


	DTOBackground* dtoBcg = (DTOBackground*)conexion->recibir();
	game->setBackground(dtoBcg);

	DTO* dto = conexion->recibir();

	std::list<DTOScenarioElement*> listElements;
	while(dto->getType() == ELEMENT){
		listElements.push_back((DTOScenarioElement*)dto);
		dto = conexion->recibir();
	}

	game->setScenearioElements(listElements);

	DTOFinHandshake* finHandshake = (DTOFinHandshake*)dto;

	conexion->enviar(new DTOCliente(this->id,CONNECTED));

	DTOCliente* fin =(DTOCliente*)conexion->recibir();

	if (fin->getOwner() == this->id) {
		delete conexion;
		delete mensajesHandshake;

		conexionAServer = new ConexionBidireccional(host,socket,finHandshake->getListenPort(),finHandshake->getBroadcastPort(),recibir,enviar,conexionActiva);
	}else{
		//TODO hacer algo porque el handshake fallo!
	}

}

ConexionCliente::~ConexionCliente(){
	delete conexionAServer;
}

void ConexionCliente::terminar(){
	this->conexionAServer->terminar();
	conexionAServer->join();
}
